[watchOS 3] watchOS に Gesture Recognizer が来た!
待ってました!
watchOS のバージョンも 3 に上がり、Apple Watch でも Gesture Recognizer の機能が利用できるようになりました。
実は watchOS 2 まで、この機能は存在しなかったんですね。
watchOS のジェスチャー
watchOS に追加されたジェスチャーは以下の 4 つです。
- WKLongPressGestureRecognizer
- 長押し
- WKPanGestureRecognizer
- ドラッグ
- WKSwipeGestureRecognizer
- スワイプ
- WKTapGestureRecognizer
- タップ
iPhone で利用できる以下の様なジェスチャーは実装されていません。
- UIPinchGestureRecognizer
- ピンチ
- UIRotationGestureRecognizer
- 回転
- UIScreenEdgePanGestureRecognizer
- 画面端ドラッグ
Apple Watch は画面が小さく回転もしないため、この 3 つは不要ですね。
WKGestureRecognizer
WKGestureRecognizer は上記 4 つのジェスチャークラスの親クラスです。
@available(watchOS 3.0, *) open class WKGestureRecognizer : NSObject { open var state: WKGestureRecognizerState { get } // abstract class open var isEnabled: Bool open func locationInObject() -> CGPoint // always refers to the interface object the gesture recognizer is attached to open func objectBounds() -> CGRect // locationInObject's viewBounds }
state プロパティは Gesture Recognizer の現在の状態を返します。
状態は以下のとおり。
@available(watchOS 3.0, *) public enum WKGestureRecognizerState : Int { case possible // = UIGestureRecognizerStatePossible case began // = UIGestureRecognizerStateBegan case changed // = UIGestureRecognizerStateChanged case ended // = UIGestureRecognizerStateEnded case cancelled // = UIGestureRecognizerStateCancelled case failed // = UIGestureRecognizerStateFailed case recognized // = UIGestureRecognizerStateRecognized }
UIGestureRecognizerState と同じです。
isEnabled プロパティは Gesture Recognizer が有効かどうかを示します。
これが false の場合はジェスチャーを検知しません。
locationInObject() メソッドはタッチイベントの現在の位置を返します。
objectBounds() メソッドはジェスチャーが登録されているオブジェクトの bounds
を返します。
WKLongPressGestureRecognizer
WKLongPressGestureRecognizer は 長押し イベントを検知します。
@available(watchOS 3.0, *) open class WKLongPressGestureRecognizer : WKGestureRecognizer { open var minimumPressDuration: CFTimeInterval open var numberOfTapsRequired: Int open var allowableMovement: CGFloat }
minimumPressDuration プロパティは長押しを検知するために必要な、ユーザーの指がオブジェクトに触れている最小時間(秒)です。
numberOfTapsRequired プロパティは長押しを検知するまでに必要なタップ回数です。
allowableMovement プロパティは長押し中にどれだけ指が動いていいかを示す距離です。
この値を大きくすると、オブジェクトを触れている間に指が多少ずれたとしても「長押し」と判定させることができます。
WKPanGestureRecognizer
WKPanGestureRecognizer は ドラッグ イベントを検知します。
@available(watchOS 3.0, *) open class WKPanGestureRecognizer : WKGestureRecognizer { open func translationInObject() -> CGPoint // always refers to the interface object the gesture recognizer is attached to open func velocityInObject() -> CGPoint // always refers to the interface object the gesture recognizer is attached to }
translationInObject() メソッドは現在のオブジェクトのドラッグの移動量を返します。
ドラッグ開始点が (0, 0) です。
velocityInObject() メソッドは現在のオブジェクトのドラッグ速度を返します。
値が大きいほど速く動いているということです。
WKSwipeGestureRecognizer
WKSwipeGestureRecognizer は スワイプ イベントを検知します。
@available(watchOS 3.0, *) open class WKSwipeGestureRecognizer : WKGestureRecognizer { open var direction: WKSwipeGestureRecognizerDirection }
direction プロパティはスワイプ検知を許可する 方向 です。
デフォルトの方向は 右 です。
@available(watchOS 3.0, *) public struct WKSwipeGestureRecognizerDirection : OptionSet { public init(rawValue: UInt) public static var right: WKSwipeGestureRecognizerDirection { get } // = UISwipeGestureRecognizerDirectionRight public static var left: WKSwipeGestureRecognizerDirection { get } // = UISwipeGestureRecognizerDirectionLeft public static var up: WKSwipeGestureRecognizerDirection { get } // = UISwipeGestureRecognizerDirectionUp public static var down: WKSwipeGestureRecognizerDirection { get } // = UISwipeGestureRecognizerDirectionDown }
1 つの WKSwipeGestureRecognizer には 1 つの direction しか設定できません。
複数の方向を設定したい場合は、複数の WKSwipeGestureRecognizer を用意しましょう。
WKTapGestureRecognizer
WKTapGestureRecognizer は タップ イベントを検知します。
@available(watchOS 3.0, *) open class WKTapGestureRecognizer : WKGestureRecognizer { open var numberOfTapsRequired: Int }
numberOfTapsRequired プロパティはタップを検知するまでに必要なタップ回数です。
これを 2 にすることによりダブルタップを検知することができます。
最後に
Gesture Recognizer が追加されたことにより Apple Watch は、より操作性が上がると思います。
Apple Watch Series 2 が発表され GPU の性能も上がり、今後 Apple Watch でできることが増えてきそうですね。
選択肢が増えるというのは開発者としては嬉しいことです。
これからの Apple Watch の発展に期待しましょう。